package dawn.jxufe.community.controller;

import dawn.jxufe.community.annotation.LoginRequired;
import dawn.jxufe.community.entity.Comment;
import dawn.jxufe.community.entity.DiscussPost;
import dawn.jxufe.community.entity.Event;
import dawn.jxufe.community.event.EventProducer;
import dawn.jxufe.community.service.CommentService;
import dawn.jxufe.community.service.DiscussPostService;
import dawn.jxufe.community.util.CommunityConstant;
import dawn.jxufe.community.util.HostHolder;
import dawn.jxufe.community.util.RedisKeyUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import java.util.Date;

/**
 * @author dawn21
 * @version 1.0
 * @date 2022/7/31 16:41
 * @component
 */
@Controller
@RequestMapping("/comment")
public class CommentController implements CommunityConstant {

    @Autowired
    private CommentService commentService;

    @Autowired
    private HostHolder hostHolder;

    @Autowired
    private EventProducer eventProducer;

    @Autowired
    private DiscussPostService discussPostService;

    @Autowired
    private RedisTemplate redisTemplate;

    // 便于后面可以通过帖子id重定向到帖子。
    @LoginRequired
    @RequestMapping(path = "/add/{discussPostId}", method = RequestMethod.POST)
    public String addComment(@PathVariable("discussPostId") int discussPostId, Comment comment) {
        comment.setUserId(hostHolder.getUser().getId());
        comment.setStatus(0); // 0为正常的评论。
        comment.setCreateTime(new Date());
        commentService.addComment(comment); // 增加评论到数据库。

        // 触发评论事件。
        Event event = new Event()
                .setTopic(TOPIC_COMMENT)
                .setUserId(hostHolder.getUser().getId())
                .setEntityType(comment.getEntityType())
                .setEntityId(comment.getEntityId())
                .setData("postId", discussPostId); // 有时需要跳转的帖子id。

        if (comment.getEntityType() == ENTITY_TYPE_POST) { // 如果事件目标类型是帖子
            // 评论的实体的id。查到后是帖子，查询目标帖子的用户。
            DiscussPost target = discussPostService.findDiscussPostById(comment.getEntityId());
            event.setEntityUserId(target.getUserId());
        }else if (comment.getEntityType() == ENTITY_TYPE_COMMENT) { // 如果事件目标类型是评论
            Comment target = commentService.findCommentById(comment.getEntityId());
            event.setEntityUserId(target.getUserId());
        }
        // 使用生产者发布消息。
        eventProducer.fireEvent(event);

        // 如果是对帖子进行评论而不是评论的评论。
        if (comment.getEntityType() == ENTITY_TYPE_POST) { // 如果事件目标类型是帖子
            // 触发发帖事件。
            event = new Event()
                    .setTopic(TOPIC_PUBLISH)
                    .setUserId(comment.getUserId())
                    .setEntityType(ENTITY_TYPE_POST)
                    .setEntityId(discussPostId);
            eventProducer.fireEvent(event); // 生产者生产。

            // 计算帖子的分数。不是立即算，而是将帖子放到redis中。
            String redisKey = RedisKeyUtil.getPostScoreKey();
            redisTemplate.opsForSet().add(redisKey, discussPostId);

        }

        // 重定向到另一个controller。
        return "redirect:/discuss/detail/" + discussPostId;
    }

}
